Podmíněné příkazy

python.edumach.cz

Program níže vykreslí 20 náhodných čtverců na náhodných pozicích:

import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20, 80)
    canvas.create_rectangle(x, y, x+a, y+a)

for i in range(1, 21):
    nahodny_ctverec()
    canvas.update()
    canvas.after(500)

Předpokládejme, že chceme program upravit tak, aby kreslil větší čtverce červeně a menší modře. V takových situacích musíme do programu zapsat podmínku. Určité příkazy se provedou pouze tehdy, když je podmínka splněna, a naopak určité příkazy se provedou, když podmínka splněna není. Například: zadali bychom, že čtverce větší než 50 pixelů budou červené a menší čtverce modré.

Náš podmíněný příkaz by mohl znít: “pokud je velikost větší než 50, vykresli červený čtverec, v opačném případě vykresli modrý čtverec”. Zapíšeme to takto:

if a > 50:
    canvas.create_rectangle(x, y, x+a, y+a, fill='red')
else:
    canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20,80)
    if a > 50:
        canvas.create_rectangle(x, y, x+a, y+a, fill='red')
    else:
        canvas.create_rectangle(x, y, x+a, y+a, fill='blue')

for i in range(1, 21):
    nahodny_ctverec()
    canvas.update()
    canvas.after(500)

Všimněte si, že za příkazem if a podmínkou následuje dvojtečka (stejně jako v cyklu for nebo po definici funkce). Dvojtečka následuje také za příkazem else, za který zapisujeme příkazy, které se mají provést, pokud podmínka není splněna. Důležité je také odsazení příkazů v zápise větvení. Všechny odsazené příkazy spadají pod větev if, resp. else. Pokud bychom některé řádky neodsadili, program by je provedl, jako by nebyly v příkazech if nebo else, nebo by ohlásil chybu odsazení.

Relační operátory

Místo a > 50 mohou být jiné podmínky (podle toho, co chceme, aby bylo splněno). Můžeme použít i takové zápisy:

Upravme funkci nahodny_ctverec() následujícím způsobem:

def nahodny_ctverec():
    x = random.randrange(300)
    y = random.randrange(300)
    a = random.randint(20,80)
    if 40 < a < 60:
        canvas.create_rectangle(x, y, x+a, y+a, fill='red')
        canvas.create_text(x+10, y+10, text=a, fill="white")
    else:
        canvas.create_rectangle(x, y, x+a, y+a, fill='blue')
        canvas.create_text(x+10, y+10, text=a, fill="white")

❓Otázky

  1. K čemu bude tento program sloužit?
  2. Jak bychom mohli tento program zjednodušit?

💾 Úkoly

Čtverec nebo kolečko 1

Vytvořte program, ve kterém je nejprve nakreslena vodorovná čára ve středu obrazovky. Pokud klikneme myší nad tuto čáru, program nakreslí modrý čtverec. Pokud klikneme pod tuto čáru, program nakreslí žluté kolečko.

Čtverec nebo kolečko 2

V předchozí úloze zkuste vynechat zápis s celou částí else a příkazy ve větvi else. Bude toto neúplné if také fungovat?

Více podmínek najednou

V podmíněném příkazu můžeme také zadat více podmínek a spojit je pomocí logických operátorů and a or. Chceme-li, aby všechny podmínky byly splněny současně, použijeme operátor and. Operátor or použijeme tehdy, když stačí splnit alespoň jednu z podmínek.

import tkinter
import random

canvas = tkinter.Canvas(width=400, height=400)
canvas.pack()

def krouzek(souradnice):
    x = souradnice.x
    y = souradnice.y
    if 100 < x < 150 and 50 < y < 100:
        canvas.create_oval(x-5, y-5, x+5, y+5, fill='green')
    else:
        canvas.create_oval(x-5, y-5, x+5, y+5, fill='yellow')

canvas.bind('<Button-1>', krouzek)

Program vykreslí zelené kroužky pouze tehdy, pokud je x v rozmezí 100 až 150 a zároveň y v rozmezí 50 až 100. Pokud na plátno mnohokrát klikneme, uvidíme, kde jsou nakresleny zelené a žluté kroužky.

❓Otázky

  1. Co udělá tento program, když změníme operátor and na operátor or?
  2. Co udělá tento program, změníme-li podmínku na x < 150 nebo y > 150?

💾 Úkoly

Korálky 1

Vytvořte program, ve kterém pomocí jediného cyklu s vnořeným větvením nakreslí 15 korálků jako na obrázku. Prvních 8 korálků bude červených a zbylých 7 modrých.

Korálky 2

Upravte předchozí program tak, aby se prvních 8 korálků barvilo náhodně červeně nebo žlutě a a zbylých 7 modře nebo zeleně. Výsledek může vypadat například jako na následujícím obrázku:

Korálky 3

Vytvořte program a v něm nadefinujte funkci koralek. V této funkci vygenerujte náhodné pozice x,yx, y pro střed korálku. Program potom podle xx-ové souřadnice nakreslí červený nebo žlutý korálek, pokud je x < 200, modrý nebo zelený korálek pro ostatní čísla.

Využijte kreslení korálků z předchozí úlohy. Když zavoláte funkci koralek v cyklu 100×, můžete dostat například takovýto obrázek:

Výpočet čísla π\pi metodou Monte Carlo

Vytvořte program, který bude generovat náhodně rozmístěné tečky v ploše 200×200 (náhodné souřadnice nechť jsou od 1 do 200). Tečky vytvořte jako malé barevné kroužky s poloměrem 2 a vygenerujte jich 10000. Červené tečky budou ty, pro které platí x2+y22002x^2+y^2 \leq 200^2, ostatní budou modré. Program vypočítá podíl počtu červených teček vzhledem k počtu všech teček. Tento podíl vynásobí 4 a výsledek na závěr vypíše do okna shellu. Matematici by uměli dokázat, že tento podíl se blíží číslu π\pi. Zkontrolujte, zda tomu tak skutečně je.

TIP: Zkuste i jiný čtverec než 200×200 nebo jiný počet teček. Jaké bude π\pi?

Vlajka Německa

Vytvořte program, který na plátno nakreslí německou vlajku. Tu budete vytvářet tak, že pomocí cyklu vygenerujete 10000×10\,000\times náhodné souřadnice x,yx,y. Souřadnice xx bude z intervalu od 10 do 350 a souřadnice yy bude z intervalu od 10 do 250. Na tyto souřadnice x,yx,y nakreslíte barevný kroužek s poloměrem 5. Barvu kroužku zvolíte podle yy-ové souřadnice následovně: když je y < 90, nakreslí se černý kroužek, když je y < 170, nakreslí se červený kroužek, jinak se nakreslí žlutý kroužek. Výsledek by měl vypadat podobně jako na obrázku:

Vyzkoušejte, jak bude výsledek vypadat, jestliže se bude generovat menší počet barevných kroužků (například 100 nebo 1000).

Vlajka ČR

Vytvořte program, který podobnou technikou, jako byla použita v předchozí úloze, nakreslí českou vlajku. Obrázek může vypadat například takto:

Modrý klín se kreslí na dvou místech:

Den a noc

  1. Vytvořte program, který podle zadaného času v hodinách nakreslí do grafické plochy 300×200 slunce nebo měsíc. Do proměnné cas přiřaďte počet hodin. Použijte příkaz větvení na to, aby se pro cas < 8 kreslil měsíc jako bílý kruh, jinak se kreslilo slunce jako žlutý kruh. Poloměr kruhu nechť je v obou případech 50 a střed kruhu má souřadnice 200, 100. Program by měl například nakreslit:

  2. Do předchozího řešení doplňte kreslení pozadí – měsíc se nakreslí na tmavomodré pozadí, slunce na světlemodré pozadí:

    Stačí, když do každé větve přidáte příkaz na kreslení velkého obdélníku, který překryje celou grafickou plochu.

  3. Upravte předchozí program tak, aby se nejdříve do proměnných x, y přiřadily souřadnice středu kruhu a ty se potom použily v příkazech create_oval. Kromě toho přidejte na úplný konec programu i kreslení zeleného obdélníku, který bude představovat krajinu. Potom program pro x = 200 a y = 150 bude kreslit scény jako na následujících obrázcích:

    Horní okraj zeleného obdélníku umístěte na y-ovou souřadnici 180.

  4. Vylepšete předchozí program tak, aby fungoval jako náhodný generátor krajinek – přiřaďte na začátku do proměnných x, y, cas náhodná čísla:

    • x z rozsahu 100, 300
    • y z rozsahu 100, 200
    • cas z rozsahu 0, 16

    Program několikrát spusťte a sledujte, zda se krajinky vytváří dle očekávání: